如何加入实体框架 [英] How to join in entity framework

查看:68
本文介绍了如何加入实体框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好



我有两张名为User和Letter的表。每个用户可以有很多字母,所以关系是一对多。我想在用户登录时查看他/她在jqxGrid中收到的所有字母。所以我需要Json格式的资源数据来填充jqxGrid。我已经编写了下面的代码,但是由于FirstorDefult,它显示了每个用户的Firs字母。所以

1)如何返回多条记录?

2)如何将它们转换为Json格式?



提前致谢



我的尝试:



在.js文件中:

Hello

I have 2 tables named "User" and "Letter". each User can have many letters, so the relationship is "one to many". I want when a User login, see all letters that he/she have received in the jqxGrid. So I need Json format for my resources data to fill jqxGrid. I have wrote the codes below, but it shows Firs letter for each User due to "FirstorDefult". so
1)How can I return multi records ?
2) How can I convert Them to Json format?

Thanks in Advance

What I have tried:

in .js file :

var source =
    {
        // fetching data to grid
        datatype: "json",
        datafields: [
                    { name: 'UserName', type: 'string' },
                    { name: 'Text', type: 'string' }
        ],
        localdata: response,
    };

    // Data Adapter for Generating data for Grid
    var dataAdapter = new $.jqx.dataAdapter(source, {
        downloadComplete: function (data, status, xhr) { },
        loadComplete: function (data) { },
        loadError: function (xhr, status, error) { }
    });




控制器中









in Controller :

public string ShowUser()
        {
            using (Test02Entities _Test02Entities = new Test02Entities())
            {
                Join _Join = new Join();
                Letter _Letter = new Letter();
                Users _Users = _Test02Entities.Users.Where(c => c.ID==6).SingleOrDefault();
                if (_Users != null)
                {
                     _Letter = _Test02Entities.Letter.Where(c => c.UserID == _Users.ID).FirstOrDefault();
                    _Join.Text = _Letter.Text;
                    _Join.UserName = _Users.UserName;
                }
                return JsonConvert.SerializeObject(_Join);
            }
        }

        public partial class Join
        {
            public string UserName { get; set; }
            public string Text { get; set; }
        }

推荐答案

.jqx.dataAdapter(source,{
downloadComplete: function (data,status,xhr){},
loadComplete: function (data){},
loadError: function (xhr,status,error){}
});
.jqx.dataAdapter(source, { downloadComplete: function (data, status, xhr) { }, loadComplete: function (data) { }, loadError: function (xhr, status, error) { } });












in Controller :

public string ShowUser()
        {
            using (Test02Entities _Test02Entities = new Test02Entities())
            {
                Join _Join = new Join();
                Letter _Letter = new Letter();
                Users _Users = _Test02Entities.Users.Where(c => c.ID==6).SingleOrDefault();
                if (_Users != null)
                {
                     _Letter = _Test02Entities.Letter.Where(c => c.UserID == _Users.ID).FirstOrDefault();
                    _Join.Text = _Letter.Text;
                    _Join.UserName = _Users.UserName;
                }
                return JsonConvert.SerializeObject(_Join);
            }
        }

        public partial class Join
        {
            public string UserName { get; set; }
            public string Text { get; set; }
        }


这将如何运作完全取决于您的实体框架方法。



如果这是您的数据库,并且您正在使用Code First,那么您可以做的最好的事情是在模型类上定义导航属性。例如:



How this will work depends entirely on your Entity Framework approach.

If this is your database, and you're using Code First, the very best thing that you can do is define Navigation properties on your model classses. For instance:

public class Users
{
   ... 
   public virtual ICollection<Letter> Letters { get; set;}
}

public class Letter
{
   ...
   [ForeignKey("User")]
   public int UserId { get; set; }

   [JsonIgnore]
   public virtual Users User { get; set; }
}

public string ShowUser(int id)
{
   using (Test02Entities _Test02Entities = new Test02Entities())
   {
      var user = _Test02Entities.Users.Find(id);
                
      return JsonConvert.SerializeObject(_Join);
   }
}



JsonIgnore属性将避免循环引用序列化问题。您可以根据需要更改此项,但这超出了快速答案的范围。



此模式利用关系数据库中数据的自然关系性质来自动提供加入,实际上是使用实体框架(IMO)的最佳方式之一。



作为旁注,如果可能的话,尽量避免使用SingleOrDefault(),因为它会枚举整个表格。 FirstOrDefault()将在满足条件时停止枚举,Find()将直接通过行键拉取。



有一个导航属性的入门:

实体框架关系&导航属性 [ ^ ]。



如果您正在使用Database First,则可以通过向edmx文件添加关联来完成相同的操作。这种方法在我的领域并不是那么牢固,但在以下方面有一个坚实的参考:

实体框架关系 - EF Designer [ ^ ]


这篇关于如何加入实体框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆