Linq& Entityframework,ISNull并从连接中获取单个值

时间:2013-02-11 03:57:41

标签: linq odata entity-framework-4.3

我正在尝试在linq中复制以下SQL查询:

Select
     l.*,
    ISNULL( i.InterestPercentage,0)
     as InterestPercentage
FROM properties l
LEFT JOIN interest i on i.ListingKey = l.ListingKey
Where i.userId = {0}

我现在真的没什么好处的。

var results = from l in context.properties
              join s in context.interest on l.ListingKey equals s.ListingKey
              where s.userId == "";

这会返回一个完整的联接,但我想返回一个附加值InterestPercentage的属性。我想我可能需要创建一个新对象,它是属性的所有列,并具有InterestPercentage的附加属性。然后添加select new MyObject { tons of property setters }

另外,我试图通过Odata公开这个,我会通过这样做失去可查询的能力吗?

3 个答案:

答案 0 :(得分:2)

您可以尝试返回

new {MainObj = l, InterestPercentage = (your calculated field)}

或者创建一个具有与上面类似结构的对象。这将帮助您避免所有属性设置。

答案 1 :(得分:0)

当您通过OData公开此查询时,您将不得不重写它以不使用连接。 OData不支持连接,但支持扩展,即在单个请求中获取相关集合。为了能够扩展OData查询,您需要在元数据中定义相应的关系,即如果要使用ListingKey作为连接字段从Properties和Interest获取数据,则需要基于这些表之间的关系在ListingKey(或另一个引用这两个的表)上。

答案 2 :(得分:0)

你没有 使用join,你可以通过自己的显式连接来模拟连接:

var results = from prp in context.properties
              from inr in context.interest // cross join

              // your own join phrase
              where inr.ListingKey == (prp.InterestPercentage ?? 0)
                    && inr.userId == ""
              select new { ... };