使用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
});
有关最佳方法的任何想法吗?
答案 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});