添加加入查询

时间:2018-02-22 00:07:27

标签: c# sql asp.net linq join

通常我会像这样进行查询

var Incentivo = _contexto.Incentivos.Where(x => x.EmpleadoID.Equals(ce) && x.mdEstatusRegistro)

然后我像这样更新表格:

 Incentivo.nPorcentajeAJU = (ajuste / Incentivo.nSueldoActual) * 100;
 Incentivo.nSueldoNuevo = Incentivo.nSueldoActual + (Incentivo.nSueldoActual * Incentivo.nPorcentajeMAT) + (Incentivo.nSueldoActual * Incentivo.nPorcentajeAJU);
 Incentivo.mdFechaModificacion = f;
 Incentivo.mdUsuarioModificacion = Usuario;
 this._contexto.Entry(Incentivo).State = System.Data.Entity.EntityState.Modified;

它工作正常,但现在我想在查询中使用Join,如:

 var Incentivo = _contexto.Incentivos.Where(x => x.EmpleadoID.Equals(ce) && x.mdEstatusRegistro)
                 .Join(captura, x => x.CapturaID, y => y.ID, (x, y) => new { x, y });

但是现在更新是无用的我得到了:

  

严重级代码描述项目文件行抑制状态   错误CS1061'IQueryable<>'不包含'nPorcentajeAJU'的定义,也没有扩展方法'nPorcentajeAJU'接受'IQueryable<>'类型的第一个参数可以找到(你错过了使用指令或程序集引用吗?)

我在每行更新中收到此消息 enter image description here

我需要做些什么才能让它发挥作用?此致

1 个答案:

答案 0 :(得分:0)

您看到此错误,因为在Incentivos加入captura后您没有选择正确的实体。

以下查询的最终输出类型

var Incentivo = _contexto.Incentivos.Where(x => x.EmpleadoID.Equals(ce) && x.mdEstatusRegistro)
             .Join(captura, x => x.CapturaID, y => y.ID, (x, y) => new { x, y });

将如下(我已根据我在问题中看到的内容来设置类型名称。它们在实际代码中可能有所不同。)

System.Linq.Enumerable+<JoinIterator>d__37`4[Incentivo ,System.String,<>f__AnonymousType0`2[Incentivo ,Captura]]

使用查询返回的IEnumerable,它将不具有Incentivo类的属性。这就是你看到错误的原因。

要解决此问题,您需要从上述集合中选择Incentivo的对象。

因此,最终查询应如下所示。

var Incentivo = _contexto.Incentivos.Where(x => x.EmpleadoID.Equals(ce) && x.mdEstatusRegistro)
             .Join(captura, x => x.CapturaID, y => y.ID, (x, y) => new { x, y }).Select(a => a.x).FirstOrDefault();

这将为您提供Incentivo类的对象,您可以在其上访问nPorcentajeAJU等属性。

如果数据库中不存在匹配的数据,Incentivo可能为空。在这种情况下,您最好在尝试访问其属性之前检查它是否为空。

以下是一个示例代码,用于复制与您相同的用例以供参考。

public class UserAddress
{
    public string Id {get;set;}
    public string UserId {get;set;} 
    public string StreetAddress {get;set;}
}


public class User
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Program
{
    public static void Main()
    {

        var users = new List<User>();
        users.Add(new User { Id = "1", FirstName = "User1", LastName = "User1"});
        users.Add(new User { Id = "2", FirstName = "User2", LastName = "User2"});
        users.Add(new User { Id = "3", FirstName = "User3", LastName = "User3"});
        users.Add(new User { Id = "4", FirstName = "User4", LastName = "User4"});
        users.Add(new User { Id = "5", FirstName = "User5", LastName = "User5"});

        var addresses  = new List<UserAddress>();

        addresses.Add(new UserAddress{Id = "1", UserId = "1", StreetAddress="Street1" });
        addresses.Add(new UserAddress{Id = "2", UserId = "2", StreetAddress="Street2" });
        addresses.Add(new UserAddress{Id = "3", UserId = "3", StreetAddress="Street3" });
        addresses.Add(new UserAddress{Id = "4", UserId = "4", StreetAddress="Street4" });

        var userId = "1";           
        var q = users.Where(u => u.Id.Equals(userId))
        .Join(addresses, u => u.Id, a => a.UserId, (u,a) => new {u,a}); 

        Console.WriteLine(q);

        var user = users.Where(u => u.Id.Equals(userId))
        .Join(addresses, u => u.Id, a => a.UserId, (u,a) => new {u,a}).Select( x => x.u).FirstOrDefault();

        Console.WriteLine(user.Id);
        Console.WriteLine(user.FirstName);
        Console.WriteLine(user.LastName);
    }
}

我希望这可以帮助您解决问题。