将联合查询转换为LINQ到实体查询

时间:2012-04-05 14:20:51

标签: c# linq entity-framework

有人可以帮助我以正确的方式将此查询转换为Linq to entities查询。我对Linq很新,并且想要正确地编写这些查询。对于我正在使用UNION和其中的子查询而言,这是一个相当复杂的问题

SELECT pf.FileID, pf.ServerName, pf.MigrationType 
FROM pOrders pf 
WHERE pf.FileID IN (select GCMFileID FROM Signals
                    where SignalFileID = " + FileID + ")
UNION 
SELECT pf.FileID, pf.ServerName, pf.MigrationType
FROM pOrders pf 
WHERE pf.FileID = " + FileID + "
order by pf.MigrationType desc

3 个答案:

答案 0 :(得分:1)

我知道,我看到了评论......但是

var signalIds = Signals.Where(s => s.SignalFileId = FILEID).Select(x => x.GCMFileID ).ToArray();

pOrders.Where(pf => signalIds.Contains(pf.FileID))
.Union(
pOrders.Where(pf => pf.FileID == FILEID))
.OrderByDescending(u => u.MigrationType)
.Select(u => new {u.FileID, u.ServerName, u.MigrationType});

答案 1 :(得分:0)

var innerquery = from t in db.Signals
                 where t.SignalFileID == FileID
                 select new {t.SignalFieldID};
var query = (from p in db.pOrders
            where p.FieldID.Contains(innerquery.SignalFieldID)
            select new {p.FileID, p.ServerName, p.MigrationType}).Union
            (from p in db.pOrders
            where p.FieldID ==FieldID
            orderby p.MigrationType
            select new {p.FileID, p.ServerName, p.MigrationType})

答案 2 :(得分:0)

我知道这是一个古老的问题,但是我想加两分钱,希望我可以为那些像我最初那样认为Union()是正确方法的人节省一些时间。

我的第一个错误步骤是在遇到第一个错误,即不能以不同的方式使用xml列类型后,使用实体的逻辑键创建自定义比较器。然后,Linq to Entities抱怨它不识别Union()。我注意到被接受的答案调用ToArray。这样,在执行联合之前,会将第一个查询的所有结果都存储到内存中。 OP希望Linq to Entities,因此您需要对IQueryable进行操作。使用Concat。整个查询将在数据库中运行。

var innerquery = (from t in db.Signals
             where t.SignalFileID == FileID
             select t.SignalFileID);
var query = (from p in db.pOrders
        where innerquery.Contains(p.FileID)
        select new {p.FileID, p.ServerName, p.MigrationType})
    .Concat(from p in db.pOrders
        where p.FileID == FileID
        select new {p.FileID, p.ServerName, p.MigrationType})
    .OrderBy(o => o.MigrationType);