我的sql server上有下表。
表名 - 用户信息
Name Company_id Task1 Task2 Task3
Anna 123 TRUE TRUE FALSE
Neeva 456 FALSE TRUE FALSE
我需要知道用户task1,task2和task3状态。例如安娜对Task1和Task2都是如此。所以我需要低于输出。
Annas详细信息为字符串 - > (task1,task2) 同样对于neeva - > (任务2)
现在使用这个SQL查询,
SELECT case WHEN ( SUBSTRING (value, LEN(value), 1) = ',') THEN
SUBSTRING (value, 1, (LEN(value) -1) )
ELSE
value END from (
select
(CASE WHEN Task1 = 1 THEN 'Task1,' ELSE ''END) +
(CASE WHEN Task2 = 1 THEN 'Task2,' ELSE ''END) +
(CASE WHEN Task3 = 1 THEN 'Task3,' ELSE ''END) value
from userinfo tab
我在SQL中使用新列获得以下结果。
(No column name)
task1,task2
task1
我需要将此输出传递给C#,而不是使用我需要的输出创建新列。对于例如如果我想知道Anna的状态,我将查询数据库并首先检查用户Anna。完成后,我将检查状态。
所以在C#方面,我需要得到类似的东西
string userdetails = task1,task2
只有在我查询用户anna时才会显示此详细信息。如何在c#中获得结果而不是在SQL列中显示结果,如上所示。
答案 0 :(得分:2)
从数据库中检索特定用户的原始数据后,可以在c#中完成所有操作。这是一个如何解决您的问题的控制台应用程序:
创建一个POCO来保存用户信息
public class UserInfo
{
public string Name { get; set; }
public string CompanyId { get; set; }
public bool Task1 { get; set; }
public bool Task2 { get; set; }
public bool Task3 { get; set; }
}
创建一个变量来保存测试数据
static List<UserInfo> _userInfo;
然后用水合变量的方法
private static void CreateMockData()
{
_userInfo = new List<UserInfo>();
_userInfo.Add(new UserInfo { Name = "Anna", CompanyId = "123", Task1 = true, Task2 = true, Task3 = false });
_userInfo.Add(new UserInfo { Name = "Neeva", CompanyId = "456", Task1 = false, Task2 = true, Task3 = false });
}
重要的工作将在另一个方法中完成,该方法将检查对象的值并返回相应的字符串
private static string GetUserInfoByName(string name)
{
StringBuilder tasks = new StringBuilder();
// THIS WOULD BE A CALL TO THE DB TO RETURN THE RAW VALUES FOR A USER
var userInfo = _userInfo.Find(e => e.Name == name);
// TEST FOR TASKS HAVING THE VALUE OF TRUE
if(userInfo.Task1)
{
tasks.Append("Task1,");
}
if(userInfo.Task2)
{
tasks.Append("Task2,");
}
if(userInfo.Task3)
{
tasks.Append("Task3");
}
// CONVERT STRING BUILDER TO A STRING
var result = tasks.ToString();
// REMOVE THE LAST COMMA IF WE HAVE ONE
if(result.EndsWith(","))
{
result = result.Remove(result.Length - 1);
}
return result;
}
以下是将所有内容放在一起的主要方法
static void Main(string[] args)
{
// THIS DATA WOULD BE IN YOUR DATABASE
CreateMockData();
var userDetails = GetUserInfoByName("Anna");
Console.WriteLine(userDetails);
userDetails = GetUserInfoByName("Neeva");
Console.WriteLine(userDetails);
Console.ReadLine();
}
输出
任务1,任务2
任务2
答案 1 :(得分:1)
不要进行字符串查询,因为它会使您的代码成为许多sql注入的目标,除非您实现了非常复杂的字符串转义。
使用C#时,您有多种选择。
我个人更喜欢第二种,因为当您在接口上构建查询(有一些限制)时,由于缺少映射,EF无法编译,因此它更适合于非常模块化的需求。