我写了一个有多个下拉字段的应用程序。用户可以在一个字段中选择更新其他字段的内容。 其他字段可能只有与其他字段匹配的托管。要知道什么是有效的,我使用SQL表。
ID | fruit1 | fruit2 | taste
---------------------------------
1 | apple | strawberry | sweet
2 | banana | strawberry | sweet
3 | apple | lemon | sour
4 | kiwi | apple | sour
首先,用户可以在每个字段中决定2个选项。
fruit1: "apple"/"banana"/"kiwi"
fruit2: "lemon"/"strawberry"/"apple"
color: "sweet"/"sour"
如果他选择"草莓"作为fruit2而不是其他领域应该只有选项,其中"草莓"在fruit2专栏中。
fruit1: "apple"/"banana"
fruit2: "strawberry"
color: "sweet"
我目前的实施非常缓慢。每次更改后都必须有一个新查询。但是每个查询都有一个更改,导致另一个查询。延迟加起来使得这个过程非常缓慢。
我现在的想法是只对每个字段执行一次sqlquery(我必须这样做)。
我的第一个想法是编写第二个应用程序,从表中提取所有数据并将其放入csv文件中。 然后我必须解析该文件以获取信息。我无法使用oledb来处理文件,所以我搜索了另一种方式。 我目前正在寻找Linq来解析文件。我正在阅读文件并将其内容放入List<字典<字符串,字符串>>
List<Dictionary<string, string>> _data = new List<Dictionary<string, string>>{new Dictionary<string, string>{{"fruit1","apple"},{"fruit2","strawberry"},{"color","red"}},new Dictionary<string, string>{{"fruit1","banana"}, {"fruit2","lemon"}, {"color","yellow"}},new Dictionary<string, string>{{"fruit1","apple"}, {"fruit2","lemon"}, {"color","green"}}};
var r = _data
.Select(i => i.Values).Cast<Dictionary<string, string>>()
.Where(d => d.ContainsValue("apple"));
.SelectMany(s=>s);
导致结果为空。结果应该再次是List&lt;字典&LT; string,string&gt;&gt ;;
执行此操作的最佳性能/可靠方式是什么?下载CSV并读取或查询并保存所有数据(就像csv一样)?
Linq查询如何能够解析List&lt;字典&LT; string,string&gt;&gt;?
答案 0 :(得分:2)
考虑到你已经在字段上有索引,为什么这会很慢?它只是简单的SQL或Linq:
的查询-SQL:
select * from myTable where fruit2 = 'Strawberry'
-Linq:
var choices = db.MyTable.Where( f => f.Fruit2 == "Strawberry" );
如果您想将所有数据传输到客户端,那么您的第一个选项可能是一个简单的列表。即:
var data = db.MyTable.ToList();
然后你可以使用Linq查询客户端:
var choices = data.Where( f => f.Fruit2 == "Strawberry");
如果要保存在列表中的数据很大,那么客户端就可以像SQLite一样保持持久性。它不需要任何安装,您可以将其数据保存到IsolatedStorage或AppData。使用CSV而不是恕我直言。您至少不能在CSV中拥有索引。
答案 1 :(得分:0)
如果你想要解析词典对象...
_data.Select(i => i.Values).Cast<Dictionary<string, string>>()
.Where(d => d.ContainsValue("apple"))
.SelectMany(s=>s).ToList().ForEach((item) =>
{
item.Key
item.Value...
});
答案 2 :(得分:0)
首先,让我们创建一个classe来表示你的表
class SampleClass
{
public int ID { get; set; }
public string Fruit1 { get; set; }
public string Fruit2 { get; set; }
public string Taste { get; set; }
}
然后,您将执行SQL查询以从表中获取日期并使用List<SampleClass>
将其存储在内存中:
List<SampleClass> data = GetDataFromDatabase();
然后你必须填写下拉列表
dropDown1.Items = data.Select(d => d.Fruit1);
dropDown2.Items = data.Select(d => d.Fruit2);
dropDown3.Items = data.Select(d => d.Fruit3);
当dropdown2更改时,您可以使用linq仅过滤Fruit2 == valueInDropDown2的数据,如下所示:
//When dropDown2 change
var selectedValueInDropDown2 = "strawberry";
dropDown1.Items = data.Where(x => x.Fruit2 == selectedValueInDropDown2).Select(d => d.Fruit1);
dropDown3.Items = data.Where(x => x.Fruit2 == selectedValueInDropDown2).Select(d => d.Fruit3);