动态指定选择列linq

时间:2016-07-19 20:14:05

标签: c# linq dynamic func

使用linq,我正在尝试实现以下逻辑 -

Iqueryable.Select(q=> new {
    if a then q.field1,q.field2,q.field3
    else if b then q.field1, q.field4
    else q.field5,q.field6,q.field7,q.field8
});

有关最佳方法的任何想法吗?

2 个答案:

答案 0 :(得分:2)

你当然可以将它封装到一个返回import lxml.etree as et # LOAD XML (FROM FILE) AND XSL (FROM STRING) xml = et.parse('Input.xml') xslstr = '''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output version="1.0" encoding="UTF-8" indent="yes" /> <xsl:strip-space elements="*"/> <!-- Identity Transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- Sort Children Text of Nodes --> <xsl:template match="cstat|legal"> <xsl:copy> <xsl:apply-templates select="*"> <xsl:sort select="." order="ascending" data-type="text"/> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:transform>''' xslt = et.fromstring(xslstr) # TRANSFORM SOURCE TO NEW TREE transform = et.XSLT(xslt) newdom = transform(xml) print(newdom) # OUTPUT TO FILE tree_out = et.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True) xmlfile = open('Output.xml','wb') xmlfile.write(tree_out) xmlfile.close() 的方法中,虽然你会失去你的类型安全性,并且始终具有动态性和一点性能。

dynamic

然后你可以调用它并从中检索数据:

public dynamic DynamicSelect(Expression<Func<Address, dynamic>> query)
{
    return Addresses.Select(query).Take(1).ToList();
}

使用var result = DynamicSelect(q => new {q.Id, q.AddressLine1}); Console.WriteLine(result[0].Id); 时,您甚至可以更进一步将其概括为:

DbSets

我个人会问自己这种灵活性是否真的有必要。你的类型安全性因为边缘性增加而导致的灵活性&#34;。

答案 1 :(得分:0)

我认为你可以尝试这样的事情

        IQueryable query;  
        if (a)
            query.Select(q=> new {q.field1,q.field2,q.field3});
        else if (b)
            query.Select(q=> new {q.field1, q.field4});
        else
            .Select(q=> new {q.field5,q.field6,q.field7,q.field8});